package com.fenqing.leetcode.code.t0_200.t100_200;

import com.fenqing.annotations.Execute;
import com.fenqing.core.Topic;

/**
 * @author fenqing
 */
public class Topic162 extends Topic {
    /**
     * 构造器
     * @param input 输入
     */
    public Topic162(String input) {
        super(input);
    }

    /**
     * 峰值元素是指其值严格大于左右相邻值的元素。
     * 给你一个整数数组 nums，找到峰值元素并返回其索引。数组可能包含多个峰值，在这种情况下，返回 任何一个峰值 所在位置即可。
     * 你可以假设 nums[-1] = nums[n] = -∞ 。
     * 你必须实现时间复杂度为 O(log n) 的算法来解决此问题。
     * 示例 1：
     * 输入：nums = [1,2,3,1]
     * 输出：2
     * 解释：3 是峰值元素，你的函数应该返回其索引 2。
     * 示例 2：
     * 输入：nums = [1,2,1,3,5,6,4]
     * 输出：1 或 5
     * 解释：你的函数可以返回索引 1，其峰值元素为 2；
     *      或者返回索引 5， 其峰值元素为 6。
     * @param nums nums
     * @return return
     */
    @Execute
    public int findPeakElement(int[] nums) {
        int p = 0, q = nums.length - 1;
        while (p < q) {
            int mid = (p + q) >> 1;
            //如果两边都比mid小，则这是一个峰值
            long numLeft = mid - 1 < 0 ? Long.MIN_VALUE : nums[mid - 1];
            long numRight = mid + 1 >= nums.length ? Long.MIN_VALUE : nums[mid + 1];
            int midVal = nums[mid];
            if (numLeft < midVal && numRight < midVal) {
                return mid;
            } if (numLeft > midVal) {
                q = mid - 1;
            } else {
                p = mid + 1;
            }
        }
        return p;
    }

    public static void main(String[] args) {
        Topic162 topic162 = new Topic162("[3,1,2]");
        Integer run = topic162.run();
        System.out.println(run);
    }

}
